Skip to content

feat(#617): remove godo (DigitalOcean SDK) from workflow core#654

Merged
intel352 merged 26 commits into
mainfrom
feat/issue-617-godo-removal
May 13, 2026
Merged

feat(#617): remove godo (DigitalOcean SDK) from workflow core#654
intel352 merged 26 commits into
mainfrom
feat/issue-617-godo-removal

Conversation

@intel352
Copy link
Copy Markdown
Contributor

Summary

Closes #617. Force-cutover removal of github.com/digitalocean/godo from workflow core. Five legacy platform.do_* modules + five step.do_* pipeline steps + cloud_account_do.go deleted (~3206 LOC across 12 files). Load-time migration errors point users to workflow-plugin-digitalocean + the new infra.* IaC type system. wfctl modernize rule rewrites legacy YAML types automatically.

Design + Plan

  • Design: docs/plans/2026-05-13-issue-617-godo-removal-design.md (3 cycles of adversarial review)
  • Plan: docs/plans/2026-05-13-issue-617-godo-removal.md (8 cycles of plan-phase adversarial review + alignment-check + scope-lock)
  • Scope-lock: docs/plans/2026-05-13-issue-617-godo-removal.md.scope-lock (manifest hash 7fcc5df5…)

Scope Manifest

  • PR Count: 1
  • Tasks: 5
  • Status: Locked 2026-05-13T00:00:00Z
PR Title Tasks
1 feat: remove godo from core (issue #617) T1, T2, T3, T4, T5

Acceptance criteria

  • AC1 — Workflow core no longer imports github.com/digitalocean/godo for IaC/App Platform behavior
  • AC2 — Existing DO App Platform behavior remains available through workflow-plugin-digitalocean v0.12.0+
  • AC3wfctl errors remain actionable when a legacy DO type is referenced (engine path + wfctl validate + wfctl ci validate all branched on iac.provider factory loaded vs not-loaded)
  • AC4 — Dependabot provider SDK bumps target the provider repo, not workflow core (enforced by new godo-banned CI gate)

Changes (per task)

  • T1 — Delete 12 legacy DO files (~3206 LOC): platform_do_{app,database,dns,networking}.go + tests, platform_doks.go + test, cloud_account_do.go, pipeline_step_do.go. Adds module/godo_absent_test.go AST regression gate.
  • T2 — Strip 13 registration sites + remap wfctl detection hooks. Includes cmd/wfctl/validate.go + ci_validate.go legacy-type injection + post-ValidateConfig sweep so wfctl validate produces the actionable migration error rather than a generic schema error.
  • T3internal/legacydo leaf package (constants + maps + formatters); engine module guard at engine.go:508; per-registry iacProviderLoaded field on StepRegistry (no global, no atomic.Bool race surface); 12 sub-cases × 2 plugin-loaded branches.
  • T4go mod tidy in root + example/; new CI job godo-banned with !-prefixed greps over *.go and go.mod files. Rollback: revert commit + re-run go mod tidy; no runtime effect after T1-T3 deletions.
  • T5wfctl modernize rule legacy-do-types (rewrites 4 module + 3 step types; flags 3 GAP types — platform.do_networking 1→2 split, step.do_logs + step.do_scale no successor); CHANGELOG.md v0.52.0 BREAKING entry; docs/migrations/v0.52.0-godo-removal.md; DOCUMENTATION.md update.

Migration

Configs using legacy types now fail to load with an actionable error pointing to workflow-plugin-digitalocean + the infra.* successor. Operators run wfctl modernize --apply <config.yaml> to auto-rewrite type fields, then manually add provider: digitalocean to each rewritten module's config: (the modernize rule does not auto-inject the provider key — see migration guide for rationale + example YAML).

Follow-up issues filed

  • workflow-plugin-digitalocean: tracking for step.iac_logs (closes step.do_logs migration GAP)
  • workflow-plugin-digitalocean: tracking for step.iac_scale (closes step.do_scale migration GAP)
  • workflow: AWS SDK audit (parallel pattern to Move provider SDK dependencies out of Workflow core #617 — RBAC/secrets/artifact stay; IaC drivers reviewed for plugin move)

Test Plan

  • go test ./... — passes (2 failures: TestFallbackRuns, TestInfraMultiEnv_E2E independently verified pre-existing on origin/main; not regressions)
  • go test -race ./... — passes
  • ! grep -rn --include="*.go" --exclude-dir=_worktrees --exclude-dir=.worktrees --exclude-dir=.claude "digitalocean/godo" . exits 0
  • ! grep -qH "digitalocean/godo" go.mod example/go.mod exits 0
  • go build ./cmd/wfctl ./cmd/server clean
  • CI godo-banned job passes (added in T4; verifies on first run)
  • wfctl modernize --apply modernize/testdata/legacy-do-config.yaml matches legacy-do-config.expected.yaml (smoke fixture)

Note on commit count

The branch carries 2 pre-existing in-flight commits (d2b7529 fix: address Copilot review, 542d54b fix(plugin/external): empty ConfigMessage) that originate from prior PRs on main ahead of origin/main. They will collapse on merge.

🤖 Generated with Claude Code

intel352 and others added 22 commits May 12, 2026 11:06
…T_PROTO step contracts

Steps that declare STRICT_PROTO mode + InputMessage + OutputMessage but no
ConfigMessage (e.g., step.eventbus.ack, step.eventbus.publish) failed engine
initialization with:

  STRICT_PROTO contract for config message "" cannot use legacy Struct
  fallback: missing protobuf message name

The step has no per-instance config schema — data flows through the input
message. Engine now treats empty ConfigMessage as "no typed config", encodes
cfg as legacy *structpb.Struct, returns nil typed payload. Plugin's typed
factory reads from InputMessage as designed.

Caught by BMW PR #278 image-launch smoke against v0.51.3 + eventbus v0.3.0
(steps.eventbus.{ack,publish,consume} have empty ConfigMessage).

Test: TestCreateTypedConfigRequestEmptyConfigMessageStrictProto.
Force-cutover single-PR plan: delete 11 legacy DO modules+steps (~3042 LOC),
strip 8 registration sites, remove godo from go.mod, add load-time migration
error pointing to workflow-plugin-digitalocean + infra.* IaC types.

AWS SDK audit deferred to follow-up issue (will auto-progress after merge).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
C-1 fix: add step-type migration guard (5 step.do_* types) alongside the
module-type guard; error message branches on plugin-loaded detection.
I-1 fix: parity matrix split into per-step rows; step.do_logs and step.do_scale
flagged as GAPs with pre-merge follow-up issues in workflow-plugin-digitalocean.
I-2 fix: migration error has two branches — 'install plugin' vs 'config-only
issue, plugin already loaded'.
Minors: exact grep invocation in T4; dns.go typo; infra_apply_test.go:1990
added to T2 review list.
Companion: wfctl modernize rules in scope of T5 (auto-rewrite YAML).
Considered approaches: added Option B' (build tag fence — rejected).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
I-1: platform_doks_test.go (164 LOC) added to deletion inventory.
     Total now 12 files / ~3206 LOC; T1 scope updated.
m-1: wfctl modernize flag corrected (--apply, not --write).
m-2: example/ sub-module go.mod also pins godo as indirect; T4 now runs
     go mod tidy in both root and example/, plus a second grep over go.mod
     files to catch residual indirect dependencies.

Cycle-1 fixes verified to hold.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
m-1: grep gates now !-prefixed to fail CI on match (|| true was silent no-op).
m-2: plugin-loaded detection simplified to single factory-map lookup.
m-3: workflow-scenarios migration sequencing constraint added.
t-1: T2 file count 9→10.

Cycle 3 verdict PASS (0 Critical / 0 Important / 3 Minor incorporated).
Pipeline advances to writing-plans.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Single-PR force-cutover, 5 tasks:
T1: delete 12 legacy DO files (~3206 LOC)
T2: strip 10 registration sites + remap wfctl detection hooks
T3: add legacy-type migration error guards (module + step paths)
T4: go mod tidy + CI grep gate
T5: docs + CHANGELOG + migration guide + wfctl modernize rules + file
    follow-up issues in workflow-plugin-digitalocean (logs/scale GAPs)
    and workflow (AWS audit)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
C-1 fix: T3 engine test uses NewStdEngine(app, logger) + AddModuleType()
         per engine.go:146,210; package workflow.
C-2 fix: T3 step test uses module.NewStepRegistry().Create() per
         pipeline_step_registry.go:18,32.
I-1 fix: T2 test calls KnownModuleTypes() / KnownStepTypes() directly
         (invented buildTypeRegistry() was never a thing).
I-2 fix: iacProviderLoaded is now sync/atomic.Bool with IsIaCProviderLoaded()
         accessor — eliminates race with parallel tests under go test -race.
I-3 fix: gap-type modernize test covers all 3 gap types (do_logs, do_scale,
         do_networking) — previously only first two.
m-1: acknowledged walkTypeNodes vs walkNodes duplication; documented intent.
m-2 fix: module.RemovedInVersion constant; no more v0.52.0 sprinkled in 7+ places.
m-3 fix: modernize/testdata/legacy-do-config.{,.expected}.yaml committed;
         end-of-PR checklist points at it.

End-of-PR checklist: added mandatory `go test -race ./...`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
C-1 fix (scope-limit Option 2): modernize Fix only renames type:, does NOT
   inject config.provider:digitalocean. Migration guide now has explicit
   manual provider-add step + example YAML + error string user will see.
C-2 fix: cmd/wfctl/deploy.go added to T2 (platform.* prefix collector +
   "no platform.* modules" error message — both updated to include infra.*).
I-1: newTestEngine intentional plugin omission documented.
I-2: T5 includes comment-hygiene cleanup for hasPlatformModules / isInfraType.
m-1 fix: newTestEngine uses mockLogger{} matching engine_test.go pattern.
m-2 fix: legacyDORemovedInVersion duplicated in modernize package (import
   cycle prevents shared constant) with keep-in-sync comment.
m-3 fix: AWS issue body now derives in-scope list from a runtime grep
   rather than copying speculative names.

Cycle 1 plan-phase fixes verified to hold.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
C-1 fix: drop redeclared mockLogger from engine_legacy_do_migration_test.go;
   reuse the existing in-package type from engine_test.go:482.
C-2 fix: drop legacyDORemovedInVersion duplicate; no import cycle exists
   (verified via go list). modernize now imports module and uses
   module.RemovedInVersion directly. Single source of truth.
I-1 fix: add TestLegacyDOStepError_PluginLoaded (was missing — only
   not-loaded branch was tested for steps).
m-1 fix: actions/checkout@v5 → @v4 (repo standard).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
C-1 fix: extract shared constants/formatters to internal/legacydo leaf
   package. Earlier cycle's "no import cycle" claim was wrong:
   module→plugin→modernize is a real transitive chain (verified via
   go list -deps). modernize cannot import module. Both packages now
   import only the leaf legacydo package.
I-1 fix: replace package-level atomic.Bool iacProviderLoaded global with
   StepRegistry instance field. Per-registry state; parallel tests can
   own fresh NewStepRegistry() instances; no global mutation between
   tests. Engine sets the field via r.SetIaCProviderLoaded(loaded) just
   before pipeline construction.
I-2 fix: design doc drops the credential-registry-zero-DO-entries test
   (unimplementable — credentialResolvers is unexported). Rationale:
   registry is additive via init(); deleting file removes init() — self-
   evidencing. No API-surface-for-test added.
m-1 fix: T2 spec includes rename of platformModules local variable to
   deployTargetModules in cmd/wfctl/deploy.go.

Cycle 1/2/3 plan-phase fixes verified to hold.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
C-1 fix: schema.ValidateConfig fires at engine.go:400 BEFORE the factory
   loop at :506. Removing legacy DO types from schema/schema.go alone
   would cause the generic schema error to mask the actionable migration
   message. T3 now appends legacydo.ModuleTypes + StepTypes to
   schema.WithExtra{Module,Step}Types so schema passes them through to
   the factory guard — the real rejection point.
I-1 fix: e.stepRegistry is interfaces.StepRegistrar; SetIaCProviderLoaded
   is not on the interface. Plan now uses the type-assertion pattern
   from engine.go:163,216 (matches precedent; interface NOT widened).
I-2 fix: stale "T3 introduces a package-level atomic" comment in the
   end-of-PR checklist updated to reflect the per-registry instance field.
m-1 fix: legacyDORule() unexported (matches peers); test in internal
   package modernize (matches sibling test files); external modernize
   import dropped.

Cycle 1-4 plan-phase fixes verified to hold.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
C-1 fix (two parts):
  - Phantom schema.WithExtraStepTypes: schema.ValidateConfig only checks
    module types, not step types. Step migration guard at StepRegistry.Create
    is correctly the sole gate. Step-types schema-injection sentence/loop
    deleted from T3.
  - wfctl validate path: cmd/wfctl/validate.go and ci_validate.go call
    schema.ValidateConfig directly (not via engine.BuildFromConfig). Without
    a hook, AC3 fails on these commands. T2 now includes both files: inject
    legacydo.ModuleTypes into opts + add post-ValidateConfig legacy sweep
    emitting legacydo.Format{Module,Step}Error.

I-1 fix: `if len(...) > 0 || true` replaced with unconditional code
   (staticcheck SA4010 was a CI lint blocker).

m-1: cycle-5 history line referenced the now-removed step-types injection;
     implicit fix via T3 edit.

Cycle 1-5 fixes verified to hold.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
C-1 fix: validate/ci_validate post-pass step sweep was incorrect —
   cfg.Pipelines is map[string]any (verified config/config.go:149), not
   a typed slice. T2 now uses yaml.Marshal/Unmarshal pattern matching
   engine.go configurePipelines. Also separates ciValidateFile's
   accumulating errs=append from validateFile's early-return.
I-1 fix: added TestValidateFile_LegacyDOModule_ReturnsActionableError
   and TestCIValidateFile_LegacyDOStep_ReturnsActionableError to T2
   to give AC3 automated coverage on the validate path.

Cycle 1-6 fixes verified to hold.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
plan-scope-check.sh requires "### Task N:" headings (H3); plan was using H2.
PR Grouping rows reference Task 1-5 and the body must match. Now passes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Removes 12 files / ~3206 LOC. Registration sites cleaned in T2.

* platform_do_app.go + test
* platform_do_database.go + test
* platform_do_dns.go + test
* platform_do_networking.go + test
* platform_doks.go + test
* cloud_account_do.go (DO credential resolvers + doClient())
* pipeline_step_do.go (5 DO App Platform step types)

Adds godo_absent_test.go as a regression gate inside module/.
* plugins/platform: drop 5 module + 5 step factories and manifest entries.
* schema/*: drop 10 entries from module/step type lists + schema descriptions.
  Update editor-schemas.golden.json to match.
* cmd/wfctl/type_registry.go: drop 10 legacy DO type entries.
* cmd/wfctl/{infra.go,deploy_providers.go,ci_run_dryrun.go}: remap
  isContainerType and deployTargetTypes to remove platform.do_app.
* cmd/wfctl/deploy.go: extend prefix check to include infra.* + rename
  platformModules → deployTargetModules + update error message.
* module/multi_region.go: rewrite DOKS multi-region hint to point at
  infra.k8s_cluster + workflow-plugin-digitalocean.
* cmd/wfctl/infra_apply_test.go: replace platform.do_app negative-test
  fixture with example.legacy_unknown synthetic type.
* cmd/wfctl/{validate.go,ci_validate.go}: inject legacydo.ModuleTypes into
  schema opts + post-ValidateConfig sweep emits actionable migration errors.
* cmd/wfctl/deploy_test.go: update error message assertion.

Creates internal/legacydo/types.go (leaf package — stdlib only) with the
legacy-DO type maps and message formatters needed by T3's engine/step-registry
guards and this task's wfctl validate edits.

Adds legacy_do_types_removed_test.go (registry-absence regression gate) +
TestValidateFile_LegacyDOModule_ReturnsActionableError and
TestCIValidateFile_LegacyDOStep_ReturnsActionableError (validate-path AC3).
Adds legacydo.FormatModuleError + legacydo.FormatStepError (already in
internal/legacydo from T2) and wires them into two rejection points:

  engine.go:508 (module path) — factory-loop guard now emits the
  actionable migration error for the 5 removed legacy DO module types,
  branching on whether iac.provider is already registered in the engine.

  pipeline_step_registry.go:Create (step path) — unknown-step guard
  now emits the actionable migration error for the 5 removed legacy DO
  step types, using the per-registry iacProviderLoaded field set via
  SetIaCProviderLoaded before pipeline construction.

  engine.go:393-398 — guarded WithExtraModuleTypes block replaced with
  unconditional injection that also includes legacydo.ModuleTypes so that
  schema.ValidateConfig passes legacy DO module types through to the
  factory-loop guard (schema rejection would mask the migration message).

SetIaCProviderLoaded bridges the boolean from engine to module package
via type assertion (interface deliberately NOT widened — no method burden
on alternate StepRegistrar implementors).

Each step type gets a per-step message; step.do_logs and step.do_scale
carry GAP messages with workarounds because no 1:1 pipeline-step
successor exists yet (follow-up issues in T5).

Tests: 5 module × 2 branches + 5 step × 2 branches = 12 sub-cases.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* go mod tidy on root and example/ drops github.com/digitalocean/godo
  (direct from root, indirect from example/).
* New CI job 'godo-banned' fails the build on any *.go import of godo OR
  any mention of godo in go.mod files. Excludes _worktrees, .worktrees,
  .claude (local agent state) and godo_absent_test.go (T1 regression gate
  that references the import path as a string literal, not an actual import).

This satisfies acceptance criterion #4 (dependabot bumps target the
provider repo, not workflow core).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* New modernize rule "legacy-do-types": auto-rewrites 5 module types and 3
  of 5 step types to infra.*; flags but does not modify the two GAP step
  types (step.do_logs, step.do_scale) and the 1→2 platform.do_networking
  split. Registered in AllRules().
* testdata/legacy-do-config.yaml: smoke-test fixture exercising all 10
  legacy types; testdata/legacy-do-config.expected.yaml: golden post-Fix
  output (types renamed, GAP types preserved, provider NOT auto-injected).
* CHANGELOG: v0.52.0 BREAKING entry.
* docs/migrations/v0.52.0-godo-removal.md: full migration guide with
  mapping tables, before/after YAML, error reference, rollback note.
  workflow-plugin-digitalocean follow-up issue URLs wired in:
    step.do_logs GAP → GoCodeAlone/workflow-plugin-digitalocean#107
    step.do_scale GAP → GoCodeAlone/workflow-plugin-digitalocean#108
* DOCUMENTATION.md: replace 10 legacy DO rows with pointers to the plugin
  and the migration guide.
* Comment hygiene: drop "legacy" framing from hasPlatformModules and
  parseInfraResourceSpecs doc comments (both functions correctly handle
  the surviving platform.kubernetes / platform.ecs module types).

Follow-up issues filed:
  GoCodeAlone/workflow-plugin-digitalocean#107 — step.iac_logs GAP
  GoCodeAlone/workflow-plugin-digitalocean#108 — step.iac_scale GAP
  #653 — AWS SDK audit (continuation of #617)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…o-types

T5 appended legacyDORule (id: legacy-do-types) to AllRules() but missed
this counter test in cmd/wfctl/modernize_test.go. Single-line fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 13, 2026 09:17
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Removes the legacy DigitalOcean IaC surface from workflow core (and its github.com/digitalocean/godo dependency), shifting DO functionality to workflow-plugin-digitalocean and adding actionable migration errors plus a wfctl modernize rule to help users update configs.

Changes:

  • Deleted legacy platform.do_* / platform.doks modules and step.do_* steps; removed godo from root + example modules.
  • Added migration guards/errors for legacy DO module + step types (engine + wfctl validate/ci validate + step registry).
  • Added a CI “godo-banned” grep gate and documentation/migration guide updates.

Reviewed changes

Copilot reviewed 53 out of 55 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
schema/testdata/editor-schemas.golden.json Removes legacy DO module/step schema entries from golden editor schema output.
schema/step_schema_builtins.go Removes built-in step schemas for step.do_*.
schema/schema.go Removes legacy DO types from the hardcoded known-type list.
schema/module_schema.go Removes built-in module schemas and step descriptions for legacy DO types.
plugins/platform/plugin.go Removes legacy DO module/step registrations from the core platform plugin.
plugins/platform/plugin_test.go Updates expected factories to reflect removal of legacy DO factories.
plugin/external/adapter.go Handles STRICT_PROTO/PROTO_WITH_LEGACY_STRUCT contracts with empty ConfigMessage by using legacy struct only.
plugin/external/adapter_test.go Adds coverage for empty ConfigMessage contract behavior.
module/platform_doks.go Deleted legacy DOKS module implementation (godo-based).
module/platform_doks_test.go Deleted tests for legacy DOKS module.
module/platform_do_networking.go Deleted legacy DO networking module implementation (godo-based).
module/platform_do_networking_test.go Deleted tests for legacy DO networking module.
module/platform_do_dns.go Deleted legacy DO DNS module implementation (godo-based).
module/platform_do_dns_test.go Deleted tests for legacy DO DNS module.
module/platform_do_database.go Deleted legacy DO database module implementation (godo-based).
module/platform_do_database_test.go Deleted tests for legacy DO database module.
module/platform_do_app.go Deleted legacy DO App Platform module implementation (godo-based).
module/platform_do_app_test.go Deleted tests for legacy DO App Platform module and DO steps.
module/pipeline_step_do.go Deleted legacy DO pipeline step implementations.
module/cloud_account_do.go Deleted DO credential resolvers + godo client helper from core.
module/pipeline_step_registry.go Adds legacy DO step-type guard with actionable migration error.
module/pipeline_step_legacy_do_migration_test.go Adds tests asserting legacy DO step types produce actionable errors.
module/multi_region.go Updates DigitalOcean multi-region error message to point to infra.* + DO plugin.
module/godo_absent_test.go Adds regression test to ensure module package does not import godo.
internal/legacydo/types.go Introduces leaf package with legacy type mappings + formatter helpers for migration errors.
engine.go Allows legacy DO module types through schema validation and returns actionable migration errors when encountered; wires iacProviderLoaded into step registry.
engine_legacy_do_migration_test.go Adds engine-level tests for legacy DO module migration errors (plugin loaded/unloaded branches).
cmd/wfctl/validate.go Adds legacy DO module allow-listing for schema + post-validate sweep for actionable errors.
cmd/wfctl/ci_validate.go Adds legacy DO module allow-listing for schema + accumulates actionable legacy DO module/step errors.
cmd/wfctl/type_registry.go Removes legacy DO types from wfctl’s known type registry.
cmd/wfctl/legacy_do_types_removed_test.go Adds tests ensuring legacy DO types are absent from the registry and validate/ci_validate emit actionable errors.
cmd/wfctl/infra.go Removes legacy platform.do_app from container-type detection.
cmd/wfctl/infra_apply.go Clarifies comments around what qualifies as platform.* modules.
cmd/wfctl/infra_apply_test.go Replaces a legacy DO module fixture type with a synthetic unknown type.
cmd/wfctl/deploy.go Expands deploy cloud scanning to include infra.* modules as deploy targets.
cmd/wfctl/deploy_test.go Updates expected error text after deploy cloud change.
cmd/wfctl/deploy_providers.go Removes platform.do_app from deploy target types.
cmd/wfctl/ci_run_dryrun.go Removes platform.do_app from dry-run deploy target types.
cmd/wfctl/modernize_test.go Asserts the new legacy-do-types modernize rule is registered.
modernize/modernize.go Registers the new legacy DO modernize rule.
modernize/legacy_do_rule.go Adds a rule that rewrites legacy DO module/step type: values to successors (and flags gaps).
modernize/legacy_do_rule_test.go Adds unit tests for legacy DO rule rewrites and gap behavior.
modernize/testdata/legacy-do-config.yaml Adds a sample legacy config fixture for modernization.
modernize/testdata/legacy-do-config.expected.yaml Adds expected post-modernize fixture (types rewritten / gaps retained).
DOCUMENTATION.md Replaces legacy DO module/step listings with guidance pointing to the DO plugin + migration guide.
docs/migrations/v0.52.0-godo-removal.md Adds the migration guide for the godo/legacy DO removal.
CHANGELOG.md Adds a v0.52.0 breaking-change entry describing the removal and migration path.
docs/plans/2026-05-13-issue-617-godo-removal.md.scope-lock Adds scope-lock hash for the plan.
docs/plans/2026-05-13-issue-617-godo-removal-design.md Adds design document for the cutover/removal.
go.mod Removes github.com/digitalocean/godo and its transitive deps.
go.sum Removes checksums for godo-related modules.
example/go.mod Removes indirect godo deps from the example submodule.
example/go.sum Removes checksums for godo-related modules in example submodule.
.github/workflows/ci.yml Adds godo-banned CI job to prevent reintroducing godo in Go sources or go.mod files.

Comment thread modernize/legacy_do_rule.go Outdated
Comment thread docs/migrations/v0.52.0-godo-removal.md Outdated
Comment thread modernize/testdata/legacy-do-config.expected.yaml
Comment thread internal/legacydo/types.go Outdated
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 13, 2026

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:262: parsing iteration count: invalid syntax
baseline-bench.txt:310214: parsing iteration count: invalid syntax
baseline-bench.txt:629715: parsing iteration count: invalid syntax
baseline-bench.txt:867301: parsing iteration count: invalid syntax
baseline-bench.txt:1153502: parsing iteration count: invalid syntax
baseline-bench.txt:1442631: parsing iteration count: invalid syntax
benchmark-results.txt:263: parsing iteration count: invalid syntax
benchmark-results.txt:326001: parsing iteration count: invalid syntax
benchmark-results.txt:652822: parsing iteration count: invalid syntax
benchmark-results.txt:941021: parsing iteration count: invalid syntax
benchmark-results.txt:1560873: parsing iteration count: invalid syntax
benchmark-results.txt:1867933: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 7763 64-Core Processor                
                            │ baseline-bench.txt │
                            │       sec/op       │
InterpreterCreation-4              4.244m ± 132%
ComponentLoad-4                    3.649m ±   3%
ComponentExecute-4                 1.951µ ±   0%
PoolContention/workers-1-4         1.092µ ±   1%
PoolContention/workers-2-4         1.086µ ±   2%
PoolContention/workers-4-4         1.089µ ±   3%
PoolContention/workers-8-4         1.089µ ±   2%
PoolContention/workers-16-4        1.110µ ±   4%
ComponentLifecycle-4               3.739m ±   1%
SourceValidation-4                 2.459µ ±   0%
RegistryConcurrent-4               870.2n ±   3%
LoaderLoadFromString-4             3.787m ±   2%
geomean                            18.32µ

                            │ baseline-bench.txt │
                            │        B/op        │
InterpreterCreation-4               2.027Mi ± 0%
ComponentLoad-4                     2.180Mi ± 0%
ComponentExecute-4                  1.203Ki ± 0%
PoolContention/workers-1-4          1.203Ki ± 0%
PoolContention/workers-2-4          1.203Ki ± 0%
PoolContention/workers-4-4          1.203Ki ± 0%
PoolContention/workers-8-4          1.203Ki ± 0%
PoolContention/workers-16-4         1.203Ki ± 0%
ComponentLifecycle-4                2.183Mi ± 0%
SourceValidation-4                  1.984Ki ± 0%
RegistryConcurrent-4                1.133Ki ± 0%
LoaderLoadFromString-4              2.182Mi ± 0%
geomean                             15.25Ki

                            │ baseline-bench.txt │
                            │     allocs/op      │
InterpreterCreation-4                15.68k ± 0%
ComponentLoad-4                      18.02k ± 0%
ComponentExecute-4                    25.00 ± 0%
PoolContention/workers-1-4            25.00 ± 0%
PoolContention/workers-2-4            25.00 ± 0%
PoolContention/workers-4-4            25.00 ± 0%
PoolContention/workers-8-4            25.00 ± 0%
PoolContention/workers-16-4           25.00 ± 0%
ComponentLifecycle-4                 18.07k ± 0%
SourceValidation-4                    32.00 ± 0%
RegistryConcurrent-4                  2.000 ± 0%
LoaderLoadFromString-4               18.06k ± 0%
geomean                               183.3

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                            │ benchmark-results.txt │
                            │        sec/op         │
InterpreterCreation-4                  9.976m ± 69%
ComponentLoad-4                        3.510m ±  1%
ComponentExecute-4                     1.865µ ±  2%
PoolContention/workers-1-4             1.192µ ±  1%
PoolContention/workers-2-4             1.188µ ±  1%
PoolContention/workers-4-4             1.181µ ±  1%
PoolContention/workers-8-4             1.181µ ±  1%
PoolContention/workers-16-4            1.186µ ±  1%
ComponentLifecycle-4                   3.536m ±  2%
SourceValidation-4                     2.311µ ±  1%
RegistryConcurrent-4                   901.4n ±  9%
LoaderLoadFromString-4                 3.583m ±  1%
geomean                                19.97µ

                            │ benchmark-results.txt │
                            │         B/op          │
InterpreterCreation-4                  2.027Mi ± 0%
ComponentLoad-4                        2.180Mi ± 0%
ComponentExecute-4                     1.203Ki ± 0%
PoolContention/workers-1-4             1.203Ki ± 0%
PoolContention/workers-2-4             1.203Ki ± 0%
PoolContention/workers-4-4             1.203Ki ± 0%
PoolContention/workers-8-4             1.203Ki ± 0%
PoolContention/workers-16-4            1.203Ki ± 0%
ComponentLifecycle-4                   2.183Mi ± 0%
SourceValidation-4                     1.984Ki ± 0%
RegistryConcurrent-4                   1.133Ki ± 0%
LoaderLoadFromString-4                 2.182Mi ± 0%
geomean                                15.25Ki

                            │ benchmark-results.txt │
                            │       allocs/op       │
InterpreterCreation-4                   15.68k ± 0%
ComponentLoad-4                         18.02k ± 0%
ComponentExecute-4                       25.00 ± 0%
PoolContention/workers-1-4               25.00 ± 0%
PoolContention/workers-2-4               25.00 ± 0%
PoolContention/workers-4-4               25.00 ± 0%
PoolContention/workers-8-4               25.00 ± 0%
PoolContention/workers-16-4              25.00 ± 0%
ComponentLifecycle-4                    18.07k ± 0%
SourceValidation-4                       32.00 ± 0%
RegistryConcurrent-4                     2.000 ± 0%
LoaderLoadFromString-4                  18.06k ± 0%
geomean                                  183.3

pkg: github.com/GoCodeAlone/workflow/middleware
cpu: AMD EPYC 7763 64-Core Processor                
                                  │ baseline-bench.txt │
                                  │       sec/op       │
CircuitBreakerDetection-4                  287.6n ± 5%
CircuitBreakerExecution_Success-4          21.54n ± 0%
CircuitBreakerExecution_Failure-4          66.31n ± 1%
geomean                                    74.34n

                                  │ baseline-bench.txt │
                                  │        B/op        │
CircuitBreakerDetection-4                 144.0 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

                                  │ baseline-bench.txt │
                                  │     allocs/op      │
CircuitBreakerDetection-4                 1.000 ± 0%
CircuitBreakerExecution_Success-4         0.000 ± 0%
CircuitBreakerExecution_Failure-4         0.000 ± 0%
geomean                                              ¹
¹ summaries must be >0 to compute geomean

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                  │ benchmark-results.txt │
                                  │        sec/op         │
CircuitBreakerDetection-4                     450.6n ± 0%
CircuitBreakerExecution_Success-4             59.70n ± 1%
CircuitBreakerExecution_Failure-4             64.84n ± 0%
geomean                                       120.4n

                                  │ benchmark-results.txt │
                                  │         B/op          │
CircuitBreakerDetection-4                    144.0 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

                                  │ benchmark-results.txt │
                                  │       allocs/op       │
CircuitBreakerDetection-4                    1.000 ± 0%
CircuitBreakerExecution_Success-4            0.000 ± 0%
CircuitBreakerExecution_Failure-4            0.000 ± 0%
geomean                                                 ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/module
cpu: AMD EPYC 7763 64-Core Processor                
                                 │ baseline-bench.txt │
                                 │       sec/op       │
JQTransform_Simple-4                     946.0n ± 23%
JQTransform_ObjectConstruction-4         1.522µ ±  7%
JQTransform_ArraySelect-4                3.455µ ±  1%
JQTransform_Complex-4                    39.93µ ±  5%
JQTransform_Throughput-4                 1.837µ ±  3%
SSEPublishDelivery-4                     67.26n ±  1%
geomean                                  1.705µ

                                 │ baseline-bench.txt │
                                 │        B/op        │
JQTransform_Simple-4                   1.273Ki ± 0%
JQTransform_ObjectConstruction-4       1.773Ki ± 0%
JQTransform_ArraySelect-4              2.625Ki ± 0%
JQTransform_Complex-4                  16.22Ki ± 0%
JQTransform_Throughput-4               1.984Ki ± 0%
SSEPublishDelivery-4                     0.000 ± 0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

                                 │ baseline-bench.txt │
                                 │     allocs/op      │
JQTransform_Simple-4                     10.00 ± 0%
JQTransform_ObjectConstruction-4         15.00 ± 0%
JQTransform_ArraySelect-4                30.00 ± 0%
JQTransform_Complex-4                    324.0 ± 0%
JQTransform_Throughput-4                 17.00 ± 0%
SSEPublishDelivery-4                     0.000 ± 0%
geomean                                             ¹
¹ summaries must be >0 to compute geomean

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                 │ benchmark-results.txt │
                                 │        sec/op         │
JQTransform_Simple-4                        876.1n ± 31%
JQTransform_ObjectConstruction-4            1.464µ ±  1%
JQTransform_ArraySelect-4                   3.167µ ±  2%
JQTransform_Complex-4                       35.12µ ±  1%
JQTransform_Throughput-4                    1.790µ ±  2%
SSEPublishDelivery-4                        76.77n ±  2%
geomean                                     1.642µ

                                 │ benchmark-results.txt │
                                 │         B/op          │
JQTransform_Simple-4                      1.273Ki ± 0%
JQTransform_ObjectConstruction-4          1.773Ki ± 0%
JQTransform_ArraySelect-4                 2.625Ki ± 0%
JQTransform_Complex-4                     16.22Ki ± 0%
JQTransform_Throughput-4                  1.984Ki ± 0%
SSEPublishDelivery-4                        0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                 │ benchmark-results.txt │
                                 │       allocs/op       │
JQTransform_Simple-4                        10.00 ± 0%
JQTransform_ObjectConstruction-4            15.00 ± 0%
JQTransform_ArraySelect-4                   30.00 ± 0%
JQTransform_Complex-4                       324.0 ± 0%
JQTransform_Throughput-4                    17.00 ± 0%
SSEPublishDelivery-4                        0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/schema
cpu: AMD EPYC 7763 64-Core Processor                
                                    │ baseline-bench.txt │
                                    │       sec/op       │
SchemaValidation_Simple-4                    1.116µ ± 1%
SchemaValidation_AllFields-4                 1.684µ ± 4%
SchemaValidation_FormatValidation-4          1.599µ ± 7%
SchemaValidation_ManySchemas-4               1.823µ ± 3%
geomean                                      1.530µ

                                    │ baseline-bench.txt │
                                    │        B/op        │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

                                    │ baseline-bench.txt │
                                    │     allocs/op      │
SchemaValidation_Simple-4                   0.000 ± 0%
SchemaValidation_AllFields-4                0.000 ± 0%
SchemaValidation_FormatValidation-4         0.000 ± 0%
SchemaValidation_ManySchemas-4              0.000 ± 0%
geomean                                                ¹
¹ summaries must be >0 to compute geomean

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                    │ benchmark-results.txt │
                                    │        sec/op         │
SchemaValidation_Simple-4                      1.027µ ±  2%
SchemaValidation_AllFields-4                   1.542µ ± 18%
SchemaValidation_FormatValidation-4            1.504µ ±  3%
SchemaValidation_ManySchemas-4                 1.485µ ±  3%
geomean                                        1.371µ

                                    │ benchmark-results.txt │
                                    │         B/op          │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

                                    │ benchmark-results.txt │
                                    │       allocs/op       │
SchemaValidation_Simple-4                      0.000 ± 0%
SchemaValidation_AllFields-4                   0.000 ± 0%
SchemaValidation_FormatValidation-4            0.000 ± 0%
SchemaValidation_ManySchemas-4                 0.000 ± 0%
geomean                                                   ¹
¹ summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/store
cpu: AMD EPYC 7763 64-Core Processor                
                                   │ baseline-bench.txt │
                                   │       sec/op       │
EventStoreAppend_InMemory-4                1.210µ ± 14%
EventStoreAppend_SQLite-4                  1.440m ±  6%
GetTimeline_InMemory/events-10-4           14.00µ ±  2%
GetTimeline_InMemory/events-50-4           61.73µ ± 27%
GetTimeline_InMemory/events-100-4          123.2µ ±  1%
GetTimeline_InMemory/events-500-4          633.6µ ±  2%
GetTimeline_InMemory/events-1000-4         1.292m ±  1%
GetTimeline_SQLite/events-10-4             108.1µ ±  0%
GetTimeline_SQLite/events-50-4             250.1µ ±  1%
GetTimeline_SQLite/events-100-4            426.5µ ±  0%
GetTimeline_SQLite/events-500-4            1.796m ±  1%
GetTimeline_SQLite/events-1000-4           3.499m ±  1%
geomean                                    217.2µ

                                   │ baseline-bench.txt │
                                   │        B/op        │
EventStoreAppend_InMemory-4                  809.5 ± 3%
EventStoreAppend_SQLite-4                  1.984Ki ± 2%
GetTimeline_InMemory/events-10-4           7.953Ki ± 0%
GetTimeline_InMemory/events-50-4           46.62Ki ± 0%
GetTimeline_InMemory/events-100-4          94.48Ki ± 0%
GetTimeline_InMemory/events-500-4          472.8Ki ± 0%
GetTimeline_InMemory/events-1000-4         944.3Ki ± 0%
GetTimeline_SQLite/events-10-4             16.74Ki ± 0%
GetTimeline_SQLite/events-50-4             87.14Ki ± 0%
GetTimeline_SQLite/events-100-4            175.4Ki ± 0%
GetTimeline_SQLite/events-500-4            846.1Ki ± 0%
GetTimeline_SQLite/events-1000-4           1.639Mi ± 0%
geomean                                    67.48Ki

                                   │ baseline-bench.txt │
                                   │     allocs/op      │
EventStoreAppend_InMemory-4                  7.000 ± 0%
EventStoreAppend_SQLite-4                    53.00 ± 0%
GetTimeline_InMemory/events-10-4             125.0 ± 0%
GetTimeline_InMemory/events-50-4             653.0 ± 0%
GetTimeline_InMemory/events-100-4           1.306k ± 0%
GetTimeline_InMemory/events-500-4           6.514k ± 0%
GetTimeline_InMemory/events-1000-4          13.02k ± 0%
GetTimeline_SQLite/events-10-4               382.0 ± 0%
GetTimeline_SQLite/events-50-4              1.852k ± 0%
GetTimeline_SQLite/events-100-4             3.681k ± 0%
GetTimeline_SQLite/events-500-4             18.54k ± 0%
GetTimeline_SQLite/events-1000-4            37.29k ± 0%
geomean                                     1.162k

cpu: Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz
                                   │ benchmark-results.txt │
                                   │        sec/op         │
EventStoreAppend_InMemory-4                   1.149µ ±  8%
EventStoreAppend_SQLite-4                     971.0µ ±  2%
GetTimeline_InMemory/events-10-4              13.29µ ±  5%
GetTimeline_InMemory/events-50-4              76.03µ ±  1%
GetTimeline_InMemory/events-100-4             149.8µ ±  2%
GetTimeline_InMemory/events-500-4             758.5µ ±  1%
GetTimeline_InMemory/events-1000-4            1.383m ± 14%
GetTimeline_SQLite/events-10-4                82.99µ ±  0%
GetTimeline_SQLite/events-50-4                240.0µ ±  2%
GetTimeline_SQLite/events-100-4               422.4µ ±  1%
GetTimeline_SQLite/events-500-4               1.890m ±  2%
GetTimeline_SQLite/events-1000-4              3.697m ±  1%
geomean                                       216.2µ

                                   │ benchmark-results.txt │
                                   │         B/op          │
EventStoreAppend_InMemory-4                     802.0 ± 7%
EventStoreAppend_SQLite-4                     1.983Ki ± 1%
GetTimeline_InMemory/events-10-4              7.953Ki ± 0%
GetTimeline_InMemory/events-50-4              46.62Ki ± 0%
GetTimeline_InMemory/events-100-4             94.48Ki ± 0%
GetTimeline_InMemory/events-500-4             472.8Ki ± 0%
GetTimeline_InMemory/events-1000-4            944.3Ki ± 0%
GetTimeline_SQLite/events-10-4                16.74Ki ± 0%
GetTimeline_SQLite/events-50-4                87.14Ki ± 0%
GetTimeline_SQLite/events-100-4               175.4Ki ± 0%
GetTimeline_SQLite/events-500-4               846.1Ki ± 0%
GetTimeline_SQLite/events-1000-4              1.639Mi ± 0%
geomean                                       67.42Ki

                                   │ benchmark-results.txt │
                                   │       allocs/op       │
EventStoreAppend_InMemory-4                     7.000 ± 0%
EventStoreAppend_SQLite-4                       53.00 ± 0%
GetTimeline_InMemory/events-10-4                125.0 ± 0%
GetTimeline_InMemory/events-50-4                653.0 ± 0%
GetTimeline_InMemory/events-100-4              1.306k ± 0%
GetTimeline_InMemory/events-500-4              6.514k ± 0%
GetTimeline_InMemory/events-1000-4             13.02k ± 0%
GetTimeline_SQLite/events-10-4                  382.0 ± 0%
GetTimeline_SQLite/events-50-4                 1.852k ± 0%
GetTimeline_SQLite/events-100-4                3.681k ± 0%
GetTimeline_SQLite/events-500-4                18.54k ± 0%
GetTimeline_SQLite/events-1000-4               37.29k ± 0%
geomean                                        1.162k

Benchmarks run with go test -bench=. -benchmem -count=6.
Regressions ≥ 20% are flagged. Results compared via benchstat.

intel352 and others added 2 commits May 13, 2026 05:33
…gration guide step example

step.do_deploy/status/destroy require different config keys in their
successors (platform + state_store vs legacy app:) — auto-rewriting the
type alone produces an invalid config. Mark step findings Fixable: false,
remove step rewrites from Fix(), update testdata fixture and tests to
reflect unchanged step types post-modernize.

Also update FormatStepError to include required config keys in the
migration error message, and fix the migration guide pipeline-step example
to show the correct step.iac_apply config shape.

Addresses Copilot review comments:
- r3232996570: make step findings non-fixable (option a)
- r3232996648: fix migration guide step example config shape
- r3232996683: fix testdata fixture to leave step types unchanged
- r3232996732: add required config keys to step migration error

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…step rewrites

step.do_deploy/status/destroy are now flagged-not-rewritten (Fixable: false)
because their successors use different config keys. Update the step mapping
table Auto-fix column and the recipe description to match.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 13, 2026 09:34
@intel352 intel352 review requested due to automatic review settings May 13, 2026 09:37
… false positives

staticcheck SA5011 flags t.Fatal()/t.Fatalf() as non-terminating because
testing.T.Fatal calls runtime.Goexit (not a panic/return), which staticcheck
does not model as a definite exit. Adding an unreachable `return` statement
after each t.Fatal in iac/conformance scenarios makes the nil-guard pattern
unambiguous to static analysis: execution cannot reach the pointer dereference
if result/res is nil.

Affected files:
- iac/conformance/scenario_delete_action.go
- iac/conformance/scenario_grpc_roundtrip.go
- iac/conformance/scenario_replace_cascade_preserves_dependents.go
- iac/conformance/scenario_upsert_on_already_exists.go

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings May 13, 2026 09:42
@intel352
Copy link
Copy Markdown
Contributor Author

Fixed Lint failure (SA5011 nil-dereference false positives) in commit 3f90451. Added return after each t.Fatal in iac/conformance scenarios — staticcheck cannot model testing.T.Fatal as a definite exit (it uses runtime.Goexit), so the unreachable return makes nil-guards unambiguous to static analysis.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 57 out of 59 changed files in this pull request and generated 2 comments.

Comment thread docs/migrations/v0.52.0-godo-removal.md Outdated
Comment thread module/godo_absent_test.go Outdated
Two corrections from Copilot's second-pass review:

1. docs/migrations/v0.52.0-godo-removal.md: plugin install snippet used a
   top-level `plugins:` sequence with `source:` which does not match the app
   config schema (ExternalPluginDecl has no source field; PluginsConfig wraps
   external under plugins.external:). Replace with the correct `wfctl plugin
   install` CLI command + wfctl.yaml manifest form (WfctlPluginEntry has source).

2. module/godo_absent_test.go: `filepath.Glob("*.go")` is non-recursive and
   only checks the current directory, not subdirectories. The comment claimed it
   covered "no file under module/", which was misleading. Switch to
   `filepath.WalkDir(".", ...)` to make the assertion match the comment's intent
   and guard against future subdirectory additions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@intel352
Copy link
Copy Markdown
Contributor Author

Addressed Copilot round 2 review in commit d868c05:

  1. docs/migrations/v0.52.0-godo-removal.md (plugin install YAML shape): Replaced invalid flat-sequence plugins: snippet with three correct forms — wfctl plugin install CLI, plugins.external: app-config auto-fetch, and requires.plugins: declaration-only (without deprecated source:/version: inline fields).

  2. module/godo_absent_test.go (non-recursive glob): Replaced filepath.Glob("*.go") with filepath.WalkDir(".", ...) to recursively enumerate all Go files under module/ tree, matching the test comment's stated intent.

@intel352 intel352 merged commit c55a56e into main May 13, 2026
26 checks passed
@intel352 intel352 deleted the feat/issue-617-godo-removal branch May 13, 2026 10:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Move provider SDK dependencies out of Workflow core

2 participants